package design_pattern.extract.extractMethod;

/**
 * @version 1.0.0
 * Created by cyd on 2023-01-08 22:45:47
 * @Description : 用于演示方法的步骤抽取
 */
public class ExtractMethodDemo {

    /**
     * 打算多处复用的方法
     *
     * @param function 命名为Function 其实是一个含有callback方法的对象
     *                 真正起作用的是callback方法
     */
    public void fillStep2(Function<String> function) {

        System.out.println("do step 01");
        // 前后步骤都打算复用，只有第2步不一样，用不同的方法替换
        String result = function.exec("use callbackParam");
        System.out.println(result);
        System.out.println("do step 03");
    }

    /**
     * 替换方案一
     *
     * @param str 注意观察str和e的传递，
     */
    public void situation01(String str) {
        // 接口没有实现类，可以直接使用匿名内部类
        fillStep2(new Function<String>() {
            @Override
            public String exec(String e) {
                System.out.print(" do something special ");
                return e + " " + str;
            }
        });
    }

    /**
     * 替换方案二，和一是一回事，只是形式不一样
     *
     * @param str 注意观察str和e的传递，
     */
    public void situation02(String str) {
        // 匿名内部类可以转化成lambda表达式，仅限于Function只有一个函数的情况
        fillStep2(e -> {
            System.out.print(" do something special ");
            return e + " " + str;
        });
    }


    public static void main(String[] args) {
        ExtractMethodDemo demo = new ExtractMethodDemo();
        demo.situation01("do step 02-1 ");
        System.out.println("-------------------");
        demo.situation02("do step 02-2 ");
        System.out.println("-------------------");
        demo.situation02("do step 02-3 ");
    }
}
